home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok17.lha
/
IFFtoImage
/
Sources
/
Fenster.mod
< prev
next >
Wrap
Text File
|
1993-08-15
|
6KB
|
198 lines
IMPLEMENTATION MODULE Fenster;
(* Hilfsmodul zur Erstellung einfacher Fenster unter Intuition. *)
FROM SYSTEM IMPORT ADR, LONGSET;
FROM Arts IMPORT Assert, TermProcedure;
FROM Intuition IMPORT CloseWindow, NewWindow, OpenWindow, WindowPtr,
WindowFlagSet, WindowFlags, IDCMPFlagSet,
IDCMPFlags,
IntuiMessagePtr, ScreenPtr, NewScreen,
OpenScreen, customScreen;
FROM Graphics IMPORT ViewModeSet, RastPortPtr, ViewPortPtr, SetAPen,
RectFill, Move, Text, SetRGB4, ViewModes;
FROM Exec IMPORT Wait, MsgPortPtr, GetMsg, ReplyMsg;
CONST
nul = 00C;
VAR
wp :WindowPtr;
s :ScreenPtr;
PROCEDURE BildSchirm():ScreenPtr;
VAR
ns :NewScreen;
BEGIN
WITH ns DO
leftEdge := 0; topEdge := 0;
width := 640; height := 256;
depth := 2;
detailPen := 0; blockPen := 1;
viewModes := ViewModeSet{hires};
type := customScreen;
font := NIL;
defaultTitle := NIL;
gadgets := NIL;
customBitMap := NIL;
END;
s := OpenScreen(ns);
Assert(s#NIL,ADR("Screen geht nicht auf!"));
RETURN s;
END BildSchirm;
PROCEDURE FensterAuf(links,oben,breit,hoch:INTEGER;
t:ARRAY OF CHAR;sP:ScreenPtr):WindowPtr;
VAR
MyWindow :NewWindow;
BEGIN
WITH MyWindow DO
leftEdge := links;
topEdge := oben;
width := breit;
height := hoch;
detailPen := 0;
blockPen := 1;
title := ADR(t);
flags := WindowFlagSet{activate,windowSizing,borderless,
windowRefresh,windowDrag,windowClose};
(* 'backDrop' ist nicht immer gut, verhindert
windowSizing etc.! *)
idcmpFlags := IDCMPFlagSet{closeWindow};
(* Dieses Flag muß gesetzt werden,
damit vom IntuitionMessagePort
die Nachricht über die Betätigung
des Schließ-Gadgets abgeholt
werden kann. *)
firstGadget := NIL;
screen := sP;
checkMark := NIL;
type := customScreen; (* = Screentyp *)
bitMap := NIL;
minWidth := 30;
minHeight := 15;
maxWidth := 640;
maxHeight := 256;
END;
wp := OpenWindow(MyWindow); (* Zeiger wp wird gebraucht, um das Fenster
mit CloseWindow(wp) wieder schließen zu
können. *)
Assert(wp#NIL,ADR("Fenster geht nicht auf!!!"));
(* Warnung, falls Fenster nicht geöffnet
werden konnte! *)
RETURN wp;
END FensterAuf;
PROCEDURE Info(up:MsgPortPtr;VAR code:CARDINAL):IDCMPFlagSet;
VAR
sig :LONGSET;
im,dummy :IntuiMessagePtr;
FLAG :IDCMPFlagSet;
BEGIN
dummy := NIL;
sig := Wait(LONGSET{up^.sigBit});
(* Mit Wait auf die Message vom
IntuitionMessagePort warten! *)
im := GetMsg(up); (* Den Zeiger auf den Message-
Record abholen. *)
code := im^.code;
FLAG := im^.class;
ReplyMsg(im); (* Die Message quittieren, damit
der IntuitionMessagePort nicht
blockiert wird. *)
dummy := GetMsg(up); (* MsgPort ausleeren! *)
WHILE dummy # NIL DO
ReplyMsg(dummy);
dummy := GetMsg(up);
END;
RETURN FLAG; (* Die Message aus dem Message-
Record holen und an Info abliefern. *)
END Info;
PROCEDURE CLS(rp:RastPortPtr;b,h:INTEGER);
BEGIN
SetAPen(rp,0);
RectFill(rp,1,9,b-12,h-9);
END CLS;
PROCEDURE Farben(vp:ViewPortPtr);
BEGIN
SetRGB4(vp, 0, 1, 1, 1);
SetRGB4(vp, 1,14, 0, 5);
SetRGB4(vp, 2, 0,14, 0);
SetRGB4(vp, 3, 5, 5,14);
(* Die Prozedur SetRGB4(vp,nr,rot,grün,blau) setzt im ViewPort vp
die Farbnummern nr (0 bis 3 bei zwei Bitplanes) auf die Rot-,
Grün- und Blau-Werte zwischen 0 und 15. Auch Kombinationen,
z.B. SetRGB4(vp,1,7,8,9) wären möglich. *)
END Farben;
(* Private *) PROCEDURE Length(t:ARRAY OF CHAR):INTEGER;
VAR
i,max :INTEGER;
BEGIN
i := 0;
max := HIGH(t); (* HIGH(t) ist eine Standard-Funktion, die
die obere Feldgrenze (= den Maximalindex)
des offenen Feldes t zurück liefert. *)
WHILE (i <= max) AND (t[i] # nul) DO
i := i+1;
END;
RETURN i;
END Length;
PROCEDURE Print(rp:RastPortPtr;f,x,y:INTEGER;t:ARRAY OF CHAR);
BEGIN
SetAPen(rp,f); (* Setzt den Schreibstift auf die Farbe f (0..3). *)
Move(rp,x,y); (* Bewegt den Schreibstift an die Position (x/y)
in Pixel. *)
Text(rp,ADR(t),Length(t));
(* Schreibt den Text t der Länge Length(t) an die
vorher mit Move(rp,x,y) festgelegte Position. *)
END Print;
PROCEDURE Echo(rp:RastPortPtr;f,x,y:INTEGER;t:CHAR);
BEGIN
SetAPen(rp,f); (* Setzt den Schreibstift auf die Farbe f (0..3). *)
Move(rp,x,y); (* Bewegt den Schreibstift an die Position (x/y)
in Pixel. *)
Text(rp,ADR(t),1);
(* Schreibt den Text t der Länge 1 (= CHAR) an die
vorher mit Move(rp,x,y) festgelegte Position. *)
END Echo;
PROCEDURE GetASCII(up:MsgPortPtr):CARDINAL;
VAR
Signal:IDCMPFlagSet;
kode :CARDINAL;
im :IntuiMessagePtr;
BEGIN
LOOP
Signal := Info(up,kode);
IF vanillaKey IN Signal THEN EXIT END;
END; (* LOOP *)
RETURN kode;
END GetASCII;
END Fenster.